/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stud.cp.core.filters;

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import stud.cp.core.plugins.PluginConst;
import stud.cp.core.security.SecurityManagerLocal;
import stud.cp.user.valueobjects.User;

/**
 * Фильтр, отвечающий
 * за секьрность jsp страниц.
 * @author Morfant
 */
public class SecurityFilter implements Filter {

    /**
     * Логгер.
     */
    private Logger logger = Logger.getLogger("CPTNP");
    /**
     * Бин, отвечающий за проверку соответствия пользователя, пароля и типа пользователя.
     */
//    private SecurityManagerLocal securityManagerBean = null;
    /**
     * Конфигурация фильтра.
     */
    private FilterConfig filterConfig = null;
    /**
     * Карта с пользователями и доступными им правами.
     */
    private Map<String, List<String>> userRights = null;

    /**
     * инициализация.
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        String userNames = filterConfig.getInitParameter("user_type");
        String userName = "";
        String userPlugins = "";
        userRights = new HashMap<String, List<String>>();
        List<String> pluginList = null;
        while (!userNames.equals("")) {
            if (userNames.indexOf(",") != -1) {
                userName = userNames.substring(0, userNames.indexOf(","));
                userPlugins = filterConfig.getInitParameter(userName);
                userNames = userNames.substring(userNames.indexOf(",") + 1);
            } else {
                userName = userNames;
                userPlugins = filterConfig.getInitParameter(userName);
                userNames = "";
            }
            pluginList = new LinkedList<String>();
            while (!userPlugins.equals("")) {
                if (userPlugins.indexOf(",") != -1) {
                    pluginList.add(userPlugins.substring(0, userPlugins.indexOf(",")));
                    userPlugins = userPlugins.substring(userPlugins.indexOf(",") + 1);
                } else {
                    pluginList.add(userPlugins);
                    userPlugins = "";
                }
            }
            userRights.put(userName, pluginList);
        }
//        Context context;
//        try {
//            context = new InitialContext();
//            //Дергаем из контекста наш плагин.
//            securityManagerBean = (SecurityManagerLocal) context.lookup(filterConfig.getInitParameter("securitybean"));
//        } catch (NamingException ex) {
//            logger.debug("Ошибка поиска бина.", ex);
//        }
    }

    /**
     * Метод, выполняющий проверку
     * реквеста на соответствие
     * расширения запроса тому, что
     * разрешен браузеру.
     * @param request Зарпос
     * @param response Отклик
     * @param chain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        String path = ((HttpServletRequest) request).getServletPath();
        String page = path.substring(path.lastIndexOf("/") + 1);
        String plugin = page.substring(0, page.lastIndexOf("."));
        String urlPatter = path.substring(path.lastIndexOf(".") + 1);
        HttpSession session = ((HttpServletRequest) request).getSession();
        User user = (User) session.getAttribute(PluginConst.CURRENT_USER);
        if (user != null) {
//            if (securityManagerBean != null) {
//                if (securityManagerBean.checkUser(user)) {
                    if (urlPatter.equals("jsp")) {
                        if (!page.equals("index.jsp") && (!page.equals("Authorization.jsp"))) {
                            filterConfig.getServletContext().getRequestDispatcher("/errorpage/404.jsp").forward(request, response);
                        }
                        chain.doFilter(request, response);
                    } else {
                        List<String> userPlugin = userRights.get(user.getUserTypeID().toString());
                        if (userPlugin.contains(plugin)) {
                            chain.doFilter(request, response);
                        } else {
                            request.setAttribute(PluginConst.ERROR_MESSAGE,
                                    "Данный плагин не существует, либо у вас недостаточно прав на использование этого плагина.");
                            filterConfig.getServletContext().getRequestDispatcher("/errorpage.jsp").forward(request, response);
                        }
                    }
//                } else {
//                    session.setAttribute(PluginConst.USER, null);
//                    request.setAttribute(PluginConst.ERROR_MESSAGE,
//                            "Данные пользователя не верны.");
//                    filterConfig.getServletContext().getRequestDispatcher("/errorpage.jsp").forward(request, response);
//                }
//            } else {
//                chain.doFilter(request, response);
//            }
        } else {
            if (page.equals("authorization-action.do")) {            /*Пользователь логинится.*/
                chain.doFilter(request, response);
            } else {
                filterConfig.getServletContext().getRequestDispatcher("/Authorization.jsp").forward(request, response);
            }
        }
    }

    /**
     * Деинициализация.
     */
    @Override
    public void destroy() {
        filterConfig = null;
//        securityManagerBean=null;
        userRights=null;
    }
}
